模型安全
[unisound 实习] Uni-Guard 文本安全审核
[unisound 实习] Uni-Guard 文本安全审核项目介绍
项目概述
Uni-Guard 是一套面向用户输入文本的内容安全审核系统,目标是在保证风险召回的同时,降低正常内容误杀,并控制大模型审核带来的推理延迟和算力成本。
项目不是依赖单一模型完成全部判断,而是采用规则、BGE-M3 和 Qwen3Guard-Stream 协同的分层架构:规则处理确定性风险,BGE-M3 快速筛选高置信样本,Qwen3Guard 复审复杂语义和灰区请求,最终输出 allow、block 或 review。
用户文本
→ 文本预处理
→ 规则层
→ BGE-M3 高置信分流
├─ 高置信 Safe → allow
├─ 高置信 Unsafe → block
└─ Grey → Qwen3Guard 复审
├─ Safe → allow
├─ Unsafe → block
└─ 不确定/冲突 → review
→ 风险记录与审计
系统设计
规则层
规则层用于处理判断标准明确、需要提供可解释证据的风险,例如确定性的高风险表达、提示词攻击模式、特殊实体及白名单场景。
- 命中明确高风险规则时,可以直接拦截。
- 命中中风险规则时,继续交给模型判断。
- 白名单可以抑制特定语境下的误命中。
- 每次规则判断都会保留命中规则和证据,便于审计和错误分析。
BGE-M3 层
BGE-M3 原本是文本向量模型。在本项目中冻结其 Encoder,基于 CLS Embedding 分别训练两个轻量分类头:
- Safety Head:判断文本属于 Safe 或 Unsafe。
- Risk Head:识别暴力、违法、色情、隐私、自残、政治敏感、版权、越狱等九类风险。
BGE-M3 的职责不是审核全部请求,而是处理最有把握的两端样本:
- Safe 概率达到高置信标准时直接放行。
- Unsafe 概率达到高置信标准时直接拦截。
- 无法达到任一高置信标准的请求进入 Grey 区,交给 Qwen3Guard。
这种设计利用了 BGE 推理快、分类结果稳定的特点,同时避免轻量模型对复杂语义做过度决策。
Qwen3Guard 层
Qwen3Guard-Stream-8B 主要处理 BGE 无法稳定判断的复杂内容,例如:
- 敏感主题的正常讨论与实际危害请求之间的区别;
- 敏感材料的翻译、改写、摘要和分类;
- 角色扮演、复杂系统提示和长文本;
- 间接诱导、越狱及规避检测;
- 表面主题相似,但用户最终请求不同的内容。
项目基于 Qwen3Guard-Stream-8B 完成多版本 LoRA 微调,并将 LoRA Adapter 与基础模型合并后使用 SGLang 部署。SGLang 用于提升大模型推理吞吐、管理显存与请求调度,并统一离线评测和部署时的推理方式。
BGE-M3 模型训练
项目没有从头训练 BGE-M3 基础模型,而是冻结 Encoder,只训练安全分类头,从而降低训练成本并快速开展多组实验。
Safety Head 实验覆盖:
- Linear、MLP256、MLP512 和更深 MLP;
- CrossEntropy 与 Focal Loss;
- 不同 Unsafe 类别权重;
- 不同学习率、训练轮数、Scheduler 和 Early Stopping;
- 不同安全阈值和双侧高置信阈值。
最终采用的 Safety Head 配置为:
Encoder:冻结 BGE-M3
Pooling:CLS
Head:MLP512
Dropout:0.1
Loss:CrossEntropy
Safe/Unsafe 权重:1.0/1.0
Learning rate:3e-4
Epochs:12
Batch size:64
Max length:128
在同源测试集上,Safety Head 达到:
- Accuracy:97.12%
- Macro-F1:96.89%
- Unsafe Recall:97.34%
在人工开发集上进一步扫描双侧阈值。较严格运行点下,BGE 高置信直接拦截 Precision 达到 99.50%。此时 BGE 只拦截最有把握的风险样本,其他请求进入 Qwen 复审。
Qwen3Guard 多版本微调
Qwen3Guard 的优化重点不是频繁修改 LoRA 方法,而是通过多版本微调验证不同数据构建方案。
主要工作包括:
- 对比 Qwen3Guard-Stream 0.6B、4B 和 8B 原模型;
- 以 8B 为主要基础模型进行 User Prompt/Query 风险分类微调;
- 比较不同训练数据来源、边界样本组合、样本权重和学习率;
- 统一训练与 SGLang 推理的输入位置和评测口径;
- 根据 FP、FN 和具体错误样本不断调整训练数据。
最终较优版本在 2,000 条人工开发集上达到:
- Accuracy:89.60%
- Unsafe Recall:94.19%
- F1:90.76%
- FN:由原始 8B 的 146 条降至 63 条
由于该人工数据参与了数据分析和模型选择,因此这些结果属于开发集指标,不作为完全独立测试集结果。
多方法安全数据构建
数据构建是项目投入最多、也是模型效果提升最关键的部分。
人工数据与运营数据整理
首先整理人工金标、运营日志和安全测试数据,统一文本字段、标签格式和数据来源信息,并进行去重、格式清洗和训练集划分。
多模型一致性筛选
使用 Q3、MiniMax 等不同模型复审原始数据:
- 多模型一致判定为合规的数据作为高置信 Safe 候选;
- 多模型一致判定为违规的数据作为高置信 Unsafe 候选;
- 判断不一致的数据单独保留,不直接作为干净标签。
Strict/Loose 与 A/B 交叉判断
使用同一个 Qwen3-4B-Instruct 基座训练 Strict 和 Loose 两种 LoRA 分类器:
- Strict 模型提高 Unsafe 数据权重,更倾向于拦截边界请求;
- Loose 模型提高 Safe 数据权重,更倾向于放行边界请求。
数据进一步拆分为 A、B 两部分,形成 A-Strict、A-Loose、B-Strict、B-Loose 四路交叉判断:
- Strict 和 Loose 都判 Safe:高置信 Safe;
- Strict 和 Loose 都判 Unsafe:高置信 Unsafe;
- Strict 判 Unsafe、Loose 判 Safe:候选边界数据;
- 反常或多路分歧样本进入过滤或复核。
这种方法用于发现处于 Safe/Unsafe 决策边界的样本,而不是直接依赖单一模型生成最终标签。
三方安全 API 复审与十桶分层
项目进一步使用腾讯、阿里和百度三方安全审核 API,对原始 8,001 条 Safe 和 16,182 条 Unsafe 数据进行复审。
根据三家 API 返回的 Pass、Review 和 Block 结果,以及它们与原始标签的一致程度,将数据划分为十个类别:
| 原始标签 | 三家合规 | 两家合规 | 其他 | 一家合规 | 零家合规 |
|---|---|---|---|---|---|
| Safe | 4,992 | 1,568 | 406 | 727 | 308 |
| Unsafe | 2,215 | 3,108 | 1,925 | 4,641 | 4,293 |
其中:
- 原始 Safe 且多数 API 合规的数据,适合作为高置信 Safe;
- 原始 Unsafe 且多数 API 判风险的数据,适合作为高置信 Unsafe;
- 原始 Unsafe 但多数 API 判合规的第 6、7 桶,是最重要的标签冲突数据。
通过分桶,可以分别控制不同置信度数据的使用方式、采样比例和训练权重,而不是把所有数据等价地加入训练。
数据对齐
为什么需要数据对齐
第 6、7 桶原始标签为 Unsafe,但多数或全部 API 判为合规。早期将这些数据统一作为风险或边界数据,会让模型过度依赖敏感主题,造成正常讨论、翻译和教育内容被误杀。
因此,项目以 2,000 条人工审核开发集为参考,重新整理第 6、7 桶的数据标签和训练用途。
对齐过程
第一步,分析人工开发集中 Safe 和 Unsafe 样本的判定特点:
- Safe:可能涉及敏感主题,但最终请求是讨论、教育、防御、分类或材料转换,没有要求实施危害。
- Unsafe:明确要求实施或促进危害,存在攻击目标、欺骗目的或可执行步骤。
- Boundary:语境不足、意图不明或不同证据冲突,无法稳定判断。
第二步,隔离训练数据与人工开发集的重合样本。第 6、7 桶原有 5,323 条,其中 212 条与开发集重合,被移出训练,只用于分析标签口径。
第三步,对剩余 5,111 条数据进行重新判断:
- 按人工审核标准进行初步规则判断;
- 使用字符级 TF-IDF,从人工开发集中查找相似的 Safe/Unsafe 案例作为参考;
- 对规则和相似案例结论冲突、或置信度不足的数据使用大模型复核;
- 仍无法稳定判断的样本保留为 Boundary,不强行生成确定标签。
最终结果:
| 对齐标签 | 数量 |
|---|---|
| Safe | 1,939 |
| Unsafe | 681 |
| Boundary | 2,491 |
这里的“数据重构”不是修改文本,而是重新确定数据的标签、类别和训练用途。
FP/FN 驱动的数据迭代
模型训练后继续分析两类错误:
- FP:实际 Safe,但模型判为风险,即正常内容误杀;
- FN:实际 Unsafe,但模型判为 Safe,即风险内容漏放。
错误分析发现,训练数据中普通分类任务 Safe 较多,但政治讨论、敏感翻译、短文本和复杂角色提示等“困难 Safe”不足。因此,后续不是简单增加 Safe 总量,而是针对模型薄弱场景补充相同主题下的 Safe/Unsafe 对照数据。
整个数据闭环可以概括为:
多模型与多 API 复审
→ 置信度和冲突分桶
→ 人工口径对齐
→ LoRA 微调
→ FP/FN 与错误样本分析
→ 补充困难 Safe/Unsafe
→ 下一轮训练与评测
项目成果
项目最终完成了:
- 一套规则、BGE-M3 和 Qwen3Guard 协同的分层安全审核方案;
- BGE-M3 Risk Head、Safety Head 的训练与阈值校准;
- Qwen3Guard-Stream-8B 的多版本 LoRA 微调与 SGLang 部署;
- 包含人工数据、多模型判断、Strict/Loose 交叉筛选、三方 API 十桶分层的数据构建体系;
- 针对标签冲突数据的 Safe/Unsafe/Boundary 对齐流程;
- 从数据处理、训练、评测、错误分析到模型交付的完整闭环。
个人工作总结
该项目主要体现了以下能力:
- 系统设计:根据准确率、召回率、延迟和成本设计多模型级联方案;
- 模型训练:完成 BGE 分类头训练及 Qwen3Guard 多版本 LoRA 微调;
- 数据构建:使用多模型一致性判断、Strict/Loose 交叉筛选和多 API 分桶构建安全数据;
- 数据对齐:依据人工审核标准重新处理标签冲突数据,并通过 FP/FN 分析持续修正训练分布;
- 工程交付:完成模型合并、SGLang 部署、批量评测、延迟测试及交付文档整理。
一句话概括:
设计并实现 Uni-Guard 分层文本安全审核系统,通过 BGE 高置信分流、Qwen3Guard 灰区复审、多方法安全数据构建和人工口径数据对齐,持续平衡风险漏放、正常内容误杀、推理延迟与算力成本。